/*
 * LDIR
 * 
 * LDIR, a GPS cartography application built for Let's Do It Romania eco 
 * campaign.
 * Copyright (C) 2010 Genera Software <office@generasoftware.com>
 * 
 * http://generasoftware.com/
 * 
 * This program is free software; you can redistribute it and/or modify it under
 * the terms of the GNU General Public License as published by the Free Software
 * Foundation; either version 2 of the License, or (at your option) any later
 * version.
 * 
 * This program is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
 * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
 * details.
 * 
 * You should have received a copy of the GNU General Public License along with
 * this program; if not, write to the Free Software Foundation, Inc., 59 Temple
 * Place, Suite 330, Boston, MA 02111-1307 USA
 */
// USER INCLUDES
#include "CustomTimer.h"
#include "Logger.h"

////////////////////////////////////////////////////////////////////////////////
CCustomTimer* CCustomTimer::NewLC(CActive::TPriority aPriority)
    {
    CCustomTimer* me = new (ELeave) CCustomTimer(aPriority);
    CleanupStack::PushL(me);
    me->ConstructL();
    return me;
    }

////////////////////////////////////////////////////////////////////////////////
CCustomTimer* CCustomTimer::NewL(CActive::TPriority aPriority)
    {
    CCustomTimer* me = CCustomTimer::NewLC(aPriority);
    CleanupStack::Pop(me);
    return me;
    }

////////////////////////////////////////////////////////////////////////////////
CCustomTimer::CCustomTimer(CActive::TPriority aPriority) :
    CActive(aPriority)
    {
    CActiveScheduler::Add(this);
    }

////////////////////////////////////////////////////////////////////////////////
CCustomTimer::~CCustomTimer()
    {
    Cancel();
    iTimer.Close();
    }

////////////////////////////////////////////////////////////////////////////////
void CCustomTimer::ConstructL()
    {
    iTimer.CreateLocal();
    }

////////////////////////////////////////////////////////////////////////////////
void CCustomTimer::After(TTimeIntervalSeconds anInterval)
    {
    iPeriodic = ETrue;
    iInterval = anInterval;
    iCurrTime.HomeTime();
    iTime = iCurrTime + iInterval;
    iTimer.At(iStatus, iTime);
    SetActive();
    }

////////////////////////////////////////////////////////////////////////////////
void CCustomTimer::At(const TTime& aTime)
    {
    iPeriodic = EFalse;
    iTime = aTime;
    iTimer.At(iStatus, iTime);
    SetActive();
    }

////////////////////////////////////////////////////////////////////////////////
void CCustomTimer::DoCancel()
    {
    iTimer.Cancel();
    }

////////////////////////////////////////////////////////////////////////////////
void CCustomTimer::RunL()
    {
    iCurrTime.HomeTime();
    if (iStatus == KErrNone)
        {
        OnTime(EOnTime, iTime);
        if (iPeriodic)
            {
            iTime = iTime + iInterval;
            if (iCurrTime > iTime)
                iTime = iCurrTime + iInterval;
            iTimer.At(iStatus, iTime);
            SetActive();
            }
        }
    else if (iStatus == KErrAbort)
        {
        if (iCurrTime > iTime)
            {
            OnTime(ESysTimeChanged, iTime);
            }
        else
            {
            iTimer.At(iStatus, iTime);
            SetActive();
            }
        }
    }

// End of file

